//
// Created by denglibin on 19-10-21.
//
/**
 *Unix系统提供了两种方式来改变信号处置：signal() 和 sigaction()。

signal() 的行为在不同Unix实现间存在差异，
 这也意味着对可移植性有所追求的程序绝不能使用此调用来建立信号处理函数。故此，sigaction() 是建立信号处理器的首选API（强力推荐）。
 **/

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>
/**
 * 信号捕捉回调函数
 * @param signo
 */
void handle(int signo){
    printf("Get a Signal NO. is %d\n", signo);
}

static void test_signal(){
    signal(SIGINT, handle); // 信号捕捉 按下Ctrl+c后执行handle函数 而不是结束进程
}
static void test_sigaction(){
    struct sigaction new_act, old_act;
    new_act.sa_handler = handle; //sa_handler此参数和signal()的参数handler相同，代表新的信号处理函数
    sigemptyset(& new_act.sa_mask); // sa_mask 用来设置在处理该信号时暂时将sa_mask 指定的信号集搁置
    new_act.sa_flags = 0; // sa_flags 用来设置信号处理的其他相关操作，下列的数值可用。
                          // SA_RESETHAND：当调用信号处理函数时，将信号的处理函数重置为缺省值SIG_DFL
                          //SA_RESTART：如果信号中断了进程的某个系统调用，则系统自动启动该系统调用
                          //SA_NODEFER ：一般情况下， 当信号处理函数运行时，内核将阻塞该给定信号。但是如果设置了 SA_NODEFER标记， 那么在该信号处理函数运行时，内核将不会阻塞该信号

    sigaction(SIGINT,&new_act,&old_act);//原来的备份到oldact里面

}

static int main_(){
    //test_signal();
    test_sigaction();
    while (1){
        printf("running\n");
        sleep(2);
    }
    return 0;
}